// 对象的扩展

// 1. 属性简洁表示法
// let name="aaaaa";
// let age=18;

// let user={
//     name,
//     age,
//     study(){
//         console.log(this.name+'自主学习');
//     }
// }

// user.study()

// 2. 属性名表达式
let name="xxxxxx";
let age=16;
let s="school";

let user={
    name,
    age,
    [s]:"家里蹲",
    study(){
        console.log(this.name+"正在"+this.school+"学习");
    }
}

user.study();

// object.is():判断两个对象是否相等
console.log(Object.is(2,"2")); //false
console.log(Object.is(NaN,NaN)); //true
console.log(NaN==NaN); //false
console.log(Object.is(+0,-0)); //false

let obj1={
    name:"xxxxxx",
    age:18
}

let obj2={
    name:"xxxxxx",
    age:18
}

console.log(Object.is(obj1,obj2));//false
console.log(obj1==obj2);//false

let obj3=obj1;

console.log(Object.is(obj1,obj3));//true
console.log(obj1==obj3);//true

// Onject.assign():合并对象
// 语法：Object.assign（target,...sources）
// 参数target:必须写 ，目标对象，接受原对象属性的对象，也就是修改后的返回值
// 参数sources:可选，源对象，包括将被合并的属性
// 返回值：目标对象

let ta={
    a:1,
    b:2
}
let sources={
    b:3,
    c:4
}

let res=Object.assign(ta,sources)
console.log(ta);//{a: 1, b: 3, c: 4}
console.log(res);//{a: 1, b: 3, c: 4}

// 如果目标对象不是对象，则会自动转换为对象。
console.log(Object.assign(1));//Number {1}
console.log(Object.assign(1,{a:2}));//Number {1, a: 2}

// 多层嵌套
let ta1={
    a:{
        b:1,
        c:2,
       g:{
           e:3
       }
    },
    e:4,
    f:5
}

let sources1={
    a:{
        b:1
    },
    e:9,
    f:0,
}

let a=Object.assign(ta1,sources1);
console.log(ta1); //结果sources1

 // 你会发现，c 和 g 属性消失了

// 注意：Object.assign() 对于引用类型属于浅拷贝。

// 5.in

let b={
    a:1,
    c:2
}
console.log("a" in b);//true

let arr=[1,2,3];
console.log(2 in arr);//true

// 6. 对象的遍历方式

// 1.for in

let person={
    name:"qqqqq",
    age:12,
    schhol:"家里"
};

for (let i in person){
    console.log(i,person[i]);
}

// 2.Object.keys()

Object.keys(person).forEach(key=>{
    console.log(key,person[key]);
})